home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / midi / chrdmstr.lha / chordmaster / source / CheckMain.c next >
C/C++ Source or Header  |  1992-10-23  |  19KB  |  515 lines

  1. #include <libraries/mui.h>
  2.  
  3. /* Protos */
  4. #include <clib/muimaster_protos.h>
  5. #include <clib/alib_protos.h>
  6. #include <clib/dos_protos.h>
  7. #include <clib/exec_protos.h>
  8.  
  9. /* Pragmas */
  10. #include <pragmas/muimaster_pragmas.h>
  11. #include <pragmas/exec_pragmas.h>
  12.  
  13. /* ChordPro */
  14. #include "ChordPro.h"
  15.  
  16. /* MUIBuilder */
  17. #include "Window.h"
  18.  
  19. #define ID_1ST 1      /*  A  On */
  20. #define ID_2ND 2      /*  A# On */
  21. #define ID_3RD 3      /*  B  On */
  22. #define ID_4TH 4      /*  C  On */
  23. #define ID_5TH 5      /*  C  On */
  24. #define ID_6TH 6      /*  D  On */
  25. #define ID_7TH 7      /*  D# On */
  26. #define ID_8TH 8      /*  E  On */
  27. #define ID_9TH 9      /*  F  On */
  28. #define ID_10TH 10    /*  F# On */
  29. #define ID_11TH 11    /*  G  On */
  30. #define ID_12TH 12    /*  G# On */
  31.  
  32. #define ID_START 13   /*  Start Search */
  33. #define ID_QUIT 14    /*  Quit */
  34. #define ID_ABOUT 15   /*  About */   
  35. #define ID_CHORDA 16  /*  Exact Chord Chosen */
  36. #define ID_CHORDB 17  /*  Oneout Chord Chosen */
  37. #define ID_CHORDC 18  /*  Twoout Chord Chosen */
  38. #define ID_CHORDCLOSE 19 /* Chord Window Close */
  39.  
  40. #define ID_1STOF 21   /*  A  Off */
  41. #define ID_2NDOF 22   /*  A# Off */
  42. #define ID_3RDOF 23   /*  B  Off */
  43. #define ID_4THOF 24   /*  C  Off */
  44. #define ID_5THOF 25   /*  C  Off */
  45. #define ID_6THOF 26   /*  D  Off */
  46. #define ID_7THOF 27   /*  D# Off */
  47. #define ID_8THOF 28   /*  E  Off */
  48. #define ID_9THOF 29   /*  F  Off */
  49. #define ID_10THOF 30  /*  F# Off */
  50. #define ID_11THOF 31  /*  G  Off */
  51. #define ID_12THOF 32  /*  G# Off */
  52.  
  53. struct Library * MUIMasterBase;
  54. char *tonal_board[12];
  55. char *inter_board[12];
  56.  
  57. CHORD_LIST head_of_chords;
  58. FOUND_LIST head_of_founds;
  59.  
  60. /* Init Function */
  61. static void init(void)
  62. {
  63.  
  64.    if (!(MUIMasterBase = OpenLibrary(MUIMASTER_NAME, MUIMASTER_VMIN)))
  65.    {
  66.       printf("Can't Open MUIMaster Library"); 
  67.       exit(20);
  68.    }
  69.  
  70. }
  71.  
  72. main()
  73. {
  74.  
  75.    inter_board[0] = inter_board[2] = inter_board[4] = inter_board[5] = inter_board[7] = inter_board[9] = inter_board[11];
  76.    inter_board[1] = inter_board[3] = inter_board[6] = inter_board[8] = inter_board[10];
  77.    tonal_board[0] = tonal_board[2] = tonal_board[3] = tonal_board[5] = tonal_board[7] = tonal_board[8] = tonal_board[10] = calloc(2, sizeof(char));
  78.    tonal_board[1] = tonal_board[4] = tonal_board[6] = tonal_board[9] = tonal_board[11] = calloc(3, sizeof(char));
  79.  
  80.    tonal_board[0] = "A\0";
  81.    inter_board[0] = "R\0";
  82.    tonal_board[1] = "A#\0";
  83.    inter_board[1] = "b2\0";
  84.    tonal_board[2] = "B\0";
  85.    inter_board[2] = "2\0";
  86.    tonal_board[3] = "C\0";
  87.    inter_board[3] = "b3\0";
  88.    tonal_board[4] = "C#\0";
  89.    inter_board[4] = "3\0";
  90.    tonal_board[5] = "D\0";
  91.    inter_board[5] = "4\0";
  92.    tonal_board[6] = "D#\0";
  93.    inter_board[6] = "b5\0";
  94.    tonal_board[7] = "E\0";
  95.    inter_board[7] = "5\0";
  96.    tonal_board[8] = "F\0";
  97.    inter_board[8] = "b6\0";
  98.    tonal_board[9] = "F#\0";
  99.    inter_board[9] = "6\0";
  100.    tonal_board[10] = "G\0";
  101.    inter_board[10] ="b7\0";
  102.    tonal_board[11] = "G#\0";
  103.    inter_board[11] = "7\0";
  104.    
  105.    struct ObjApp * App = NULL;
  106.    BOOL running = TRUE;
  107.    ULONG signal;
  108.    extern struct ObjApp * CreateSmall_Example(void);
  109.    char *STR_MessageAbout = "\0338\033c ChordMaster v1.0 by Chris Carr 1995";
  110.    char *STR_MessageStart = "\0338\033c Searching...";
  111.    char *STR_MessageFound = "\0338\033c Search Complete";
  112.    char *STR_MessageNumber = "\0338\033c No Notes Selected - Need At Least One Note";
  113.    char *main_encoding = "000000000000\0";
  114.    int nm_notes = 0;
  115.    int count = 0;
  116.    int found = 0;
  117.    head_of_chords = read_chords();
  118.    char *buf = calloc(20, sizeof(char));
  119.    char *buf2 = calloc(20, sizeof(char)); 
  120.    char *buf3 = calloc(20, sizeof(char));
  121.    char *notes0 = calloc(30, sizeof(char));
  122.    char *inter0 = calloc(30, sizeof(char));
  123.    char *temp = calloc(20, sizeof(char));
  124.    buf = buf2 = buf3 = "                   \0";
  125.    notes0 =  "                            \0";
  126.    
  127.    FOUND_LIST current_found;
  128.  
  129.    init();
  130.  
  131.    App = CreateApp();
  132.  
  133.    DoMethod(App->Chord_Pro_Window, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, App->App, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
  134.    DoMethod(App->Note0, MUIM_Notify, MUIA_Selected, FALSE, App->App, 2, MUIM_Application_ReturnID, ID_1STOF);
  135.    DoMethod(App->Note1, MUIM_Notify, MUIA_Selected, FALSE, App->App, 2, MUIM_Application_ReturnID, ID_2NDOF);
  136.    DoMethod(App->Note2, MUIM_Notify, MUIA_Selected, FALSE, App->App, 2, MUIM_Application_ReturnID, ID_3RDOF);
  137.    DoMethod(App->Note3, MUIM_Notify, MUIA_Selected, FALSE, App->App, 2, MUIM_Application_ReturnID, ID_4THOF);
  138.    DoMethod(App->Note4, MUIM_Notify, MUIA_Selected, FALSE, App->App, 2, MUIM_Application_ReturnID, ID_5THOF);
  139.    DoMethod(App->Note5, MUIM_Notify, MUIA_Selected, FALSE, App->App, 2, MUIM_Application_ReturnID, ID_6THOF);
  140.    DoMethod(App->Note6, MUIM_Notify, MUIA_Selected, FALSE, App->App, 2, MUIM_Application_ReturnID, ID_7THOF);
  141.    DoMethod(App->Note7, MUIM_Notify, MUIA_Selected, FALSE, App->App, 2, MUIM_Application_ReturnID, ID_8THOF);
  142.    DoMethod(App->Note8, MUIM_Notify, MUIA_Selected, FALSE, App->App, 2, MUIM_Application_ReturnID, ID_9THOF);
  143.    DoMethod(App->Note9, MUIM_Notify, MUIA_Selected, FALSE, App->App, 2, MUIM_Application_ReturnID, ID_10THOF);
  144.    DoMethod(App->Note10, MUIM_Notify, MUIA_Selected, FALSE, App->App, 2, MUIM_Application_ReturnID, ID_11THOF);  
  145.    DoMethod(App->Note11, MUIM_Notify, MUIA_Selected, FALSE, App->App, 2, MUIM_Application_ReturnID, ID_12THOF);
  146.  
  147.    DoMethod(App->Note0, MUIM_Notify, MUIA_Selected, TRUE, App->App, 2, MUIM_Application_ReturnID, ID_1ST);
  148.    DoMethod(App->Note1, MUIM_Notify, MUIA_Selected, TRUE, App->App, 2, MUIM_Application_ReturnID, ID_2ND);
  149.    DoMethod(App->Note2, MUIM_Notify, MUIA_Selected, TRUE, App->App, 2, MUIM_Application_ReturnID, ID_3RD);
  150.    DoMethod(App->Note3, MUIM_Notify, MUIA_Selected, TRUE, App->App, 2, MUIM_Application_ReturnID, ID_4TH);
  151.    DoMethod(App->Note4, MUIM_Notify, MUIA_Selected, TRUE, App->App, 2, MUIM_Application_ReturnID, ID_5TH);
  152.    DoMethod(App->Note5, MUIM_Notify, MUIA_Selected, TRUE, App->App, 2, MUIM_Application_ReturnID, ID_6TH);
  153.    DoMethod(App->Note6, MUIM_Notify, MUIA_Selected, TRUE, App->App, 2, MUIM_Application_ReturnID, ID_7TH);
  154.    DoMethod(App->Note7, MUIM_Notify, MUIA_Selected, TRUE, App->App, 2, MUIM_Application_ReturnID, ID_8TH);
  155.    DoMethod(App->Note8, MUIM_Notify, MUIA_Selected, TRUE, App->App, 2, MUIM_Application_ReturnID, ID_9TH);
  156.    DoMethod(App->Note9, MUIM_Notify, MUIA_Selected, TRUE, App->App, 2, MUIM_Application_ReturnID, ID_10TH);
  157.    DoMethod(App->Note10, MUIM_Notify, MUIA_Selected, TRUE, App->App, 2, MUIM_Application_ReturnID, ID_11TH);  
  158.    DoMethod(App->Note11, MUIM_Notify, MUIA_Selected, TRUE, App->App, 2, MUIM_Application_ReturnID, ID_12TH);
  159.  
  160.    DoMethod(App->StartButton, MUIM_Notify, MUIA_Pressed, FALSE, App->App, 2, MUIM_Application_ReturnID, ID_START);
  161.    DoMethod(App->QuitButton, MUIM_Notify, MUIA_Pressed, FALSE, App->App, 2, MUIM_Application_ReturnID, ID_QUIT);
  162.    DoMethod(App->AboutButton, MUIM_Notify, MUIA_Pressed, FALSE, App->App, 2, MUIM_Application_ReturnID, ID_ABOUT);
  163.   /*  DoMethod(App->Chord_Info_Window, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, App->Chord_Info_Window, 3, MUIM_Set, MUIA_Window_Open,FALSE); */
  164.    DoMethod(App->Chord_Info_Window, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, App->App, 2, MUIM_Application_ReturnID, ID_CHORDCLOSE);
  165.    DoMethod(App->ExactList, MUIM_Notify, MUIA_Listview_DoubleClick, TRUE, App->App, 2, MUIM_Application_ReturnID, ID_CHORDA);
  166.    DoMethod(App->OneOutList, MUIM_Notify, MUIA_Listview_DoubleClick, TRUE, App->App, 2, MUIM_Application_ReturnID, ID_CHORDB);
  167.    DoMethod(App->TwoOutList, MUIM_Notify, MUIA_Listview_DoubleClick, TRUE, App->App, 2, MUIM_Application_ReturnID, ID_CHORDC);
  168.  
  169.    set(App->Chord_Pro_Window, MUIA_Window_Open, TRUE);
  170.  
  171.    while (running)
  172.    {
  173.       switch(DoMethod(App->App, MUIM_Application_Input, &signal))
  174.       {
  175.          case ID_1ST:
  176.             /* printf("A Chosen\n"); */
  177.             main_encoding[0] = '1';
  178.             nm_notes += 1;
  179.             break;
  180.          case ID_2ND:
  181.             /* printf("A# Chosen\n"); */
  182.             main_encoding[1] = '1';
  183.             nm_notes += 1;
  184.             break;
  185.          case ID_3RD:
  186.             /* printf("B Chosen\n"); */
  187.             main_encoding[2] = '1';
  188.             nm_notes += 1;
  189.             break;
  190.          case ID_4TH:
  191.             /* printf("C Chosen\n"); */
  192.             main_encoding[3] = '1';
  193.             nm_notes += 1;
  194.             break;
  195.          case ID_5TH:
  196.             /* printf("C# Chosen\n"); */
  197.             main_encoding[4] = '1';
  198.             nm_notes += 1;
  199.             break;
  200.          case ID_6TH:
  201.             /* printf("D Chosen\n"); */
  202.             main_encoding[5] = '1';
  203.             nm_notes += 1;
  204.             break;
  205.          case ID_7TH:
  206.             /* printf("D# Chosen\n"); */
  207.             main_encoding[6] = '1';
  208.             nm_notes += 1;
  209.             break;
  210.          case ID_8TH:
  211.             /* printf("E Chosen\n"); */
  212.             main_encoding[7] = '1';
  213.             nm_notes += 1;
  214.             break;
  215.          case ID_9TH:
  216.             /* printf("F Chosen\n"); */
  217.             main_encoding[8] = '1';
  218.             nm_notes += 1;
  219.             break;
  220.          case ID_10TH:
  221.             /* printf("F# Chosen\n"); */
  222.             main_encoding[9] = '1';
  223.             nm_notes += 1;
  224.             break;
  225.          case ID_11TH:
  226.             /* printf("G Chosen\n"); */
  227.             main_encoding[10] = '1';
  228.             nm_notes += 1;
  229.             break;
  230.          case ID_12TH:
  231.             /* printf("G# Chosen\n"); */
  232.             main_encoding[11] = '1';
  233.             nm_notes += 1;
  234.             break;
  235.          case ID_1STOF:
  236.             /* printf("A UnChosen\n"); */
  237.             main_encoding[0] = '0';
  238.             nm_notes -= 1;
  239.             break;
  240.          case ID_2NDOF:
  241.             /* printf("A# UnChosen\n"); */
  242.             main_encoding[1] = '0';
  243.             nm_notes -= 1;
  244.             break;
  245.          case ID_3RDOF:
  246.             /* printf("B UnChosen\n"); */
  247.             main_encoding[2] = '0';
  248.             nm_notes -= 1;
  249.             break;
  250.          case ID_4THOF:
  251.             /* printf("C UnChosen\n"); */
  252.             main_encoding[3] = '0';
  253.             nm_notes -= 1;
  254.             break;
  255.          case ID_5THOF:
  256.             /* printf("C# UnChosen\n"); */
  257.             main_encoding[4] = '0';
  258.             nm_notes -= 1;
  259.             break;
  260.          case ID_6THOF:
  261.             /* printf("D UnChosen\n"); */
  262.             main_encoding[5] = '0';
  263.             nm_notes -= 1;
  264.             break;
  265.          case ID_7THOF:
  266.             /* printf("D# UnChosen\n"); */
  267.             main_encoding[6] = '0';
  268.             nm_notes -= 1;
  269.             break;
  270.          case ID_8THOF:
  271.             /* printf("E UnChosen\n"); */
  272.             main_encoding[7] = '0';
  273.             nm_notes -= 1;
  274.             break;
  275.          case ID_9THOF:
  276.             /* printf("F UnChosen\n"); */
  277.             main_encoding[8] = '0';
  278.             nm_notes -= 1;
  279.             break;
  280.          case ID_10THOF:
  281.             /* printf("F# UnChosen\n"); */
  282.             main_encoding[9] = '0';
  283.             nm_notes -= 1;
  284.             break;
  285.          case ID_11THOF:
  286.             /* printf("G UnChosen\n"); */
  287.             main_encoding[10] = '0';
  288.             nm_notes -= 1;
  289.             break;
  290.          case ID_12THOF:
  291.             /* printf("G# UnChosen\n"); */
  292.             main_encoding[11] = '0';
  293.             nm_notes -= 1;
  294.             break;
  295.          case ID_START:
  296.             if (nm_notes > 0)
  297.             {
  298.                set(App->Info, MUIA_Text_Contents, STR_MessageStart);
  299.                DoMethod(App->ExactList, MUIM_List_Clear);
  300.                DoMethod(App->OneOutList, MUIM_List_Clear);
  301.                DoMethod(App->TwoOutList, MUIM_List_Clear);
  302.                start_search(main_encoding, nm_notes);
  303.                current_found = head_of_founds;
  304.                while (current_found != NULL)
  305.                {
  306.                   if (current_found->match == 0)
  307.                   {
  308.                      strcpy(temp, current_found->full_chord_name);
  309.                      /* printf("Name = %s\n", temp); */
  310.                      DoMethod(App->ExactList, MUIM_List_Insert, &temp, 1, MUIV_List_Insert_Bottom);    
  311.                   }
  312.                   else if (current_found->match ==1 )
  313.                   {
  314.                      strcpy(temp, current_found->full_chord_name);
  315.                      /* printf("Name = %s\n", temp); */
  316.                      DoMethod(App->OneOutList, MUIM_List_Insert, &temp, 1, MUIV_List_Insert_Bottom);    
  317.                   }
  318.                   else if (current_found->match == 2)
  319.                   {
  320.                      strcpy(temp, current_found->full_chord_name);
  321.                      /* printf("Name = %s\n", temp); */
  322.                      DoMethod(App->TwoOutList, MUIM_List_Insert, &temp, 1, MUIV_List_Insert_Bottom);    
  323.                   }
  324.                   /* printf("Name %s, Notes %s, Match %d\n", current_found->full_chord_name, current_found->chord_notes, current_found->match); */
  325.                   current_found = current_found->next;
  326.                }
  327.                set(App->Info, MUIA_Text_Contents, STR_MessageFound);
  328.                break;
  329.             }
  330.             else
  331.             {
  332.                set(App->Info, MUIA_Text_Contents, STR_MessageNumber);
  333.                break;
  334.             }
  335.          case ID_ABOUT:
  336.             /* printf("About Chosen\n"); */
  337.             set(App->Info, MUIA_Text_Contents, STR_MessageAbout); 
  338.             break;
  339.          case ID_CHORDA:
  340.             found = 0;
  341.             set(App->Chord_Info_Window, MUIA_Window_Open, TRUE);
  342.             DoMethod(App->ExactList, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &buf);
  343.             set(App->Chord_Pro_Window, MUIA_Window_Sleep, TRUE);
  344.             current_found = head_of_founds;
  345.             while ((current_found != NULL) && (found != 1))
  346.             {
  347.                if (!(strcmp(buf, current_found->full_chord_name)))
  348.                {
  349.                   found = 1;
  350.                   strcpy(notes0, current_found->chord_notes);
  351.                   strcpy(inter0, current_found->intervals);
  352.                   break;
  353.                }
  354.                current_found = current_found->next;
  355.             }
  356.             set(App->Chord_Name_Box, MUIA_Text_Contents, buf);
  357.             set(App->Chord_Notes_Box, MUIA_Text_Contents, notes0);
  358.             set(App->Chord_Intervals_Box, MUIA_Text_Contents, inter0);
  359.             break;
  360.          case ID_CHORDB:
  361.             found = 0;
  362.             DoMethod(App->OneOutList, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &buf2);
  363.             set(App->Chord_Info_Window, MUIA_Window_Open, TRUE);
  364.             set(App->Chord_Pro_Window, MUIA_Window_Sleep, TRUE);            
  365.             current_found = head_of_founds;
  366.             while ((current_found != NULL) && (found != 1))
  367.             {
  368.                if (!(strcmp(buf2, current_found->full_chord_name)))
  369.                {
  370.                   found = 1;
  371.                   strcpy(notes0, current_found->chord_notes);
  372.                   strcpy(inter0, current_found->intervals);
  373.                   break;
  374.                }
  375.                current_found = current_found->next;
  376.             }
  377.             set(App->Chord_Name_Box, MUIA_Text_Contents, buf2);
  378.             set(App->Chord_Notes_Box, MUIA_Text_Contents, notes0);
  379.             set(App->Chord_Intervals_Box, MUIA_Text_Contents, inter0);
  380.             break;
  381.          case ID_CHORDC:
  382.             found = 0;
  383.             set(App->Chord_Info_Window, MUIA_Window_Open, TRUE);  
  384.             DoMethod(App->TwoOutList, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &buf3);
  385.             set(App->Chord_Pro_Window, MUIA_Window_Sleep, TRUE);
  386.             set(App->Chord_Name_Box, MUIA_Text_Contents, buf3);
  387.             current_found = head_of_founds;
  388.             while ((current_found != NULL) && (found != 1))
  389.             {
  390.                if (!(strcmp(buf3, current_found->full_chord_name)))
  391.                {
  392.                   found = 1;
  393.                   strcpy(notes0, current_found->chord_notes);
  394.                   strcpy(inter0, current_found->intervals);
  395.                   break;
  396.                }
  397.                current_found = current_found->next;
  398.             }
  399.             set(App->Chord_Notes_Box, MUIA_Text_Contents, notes0);
  400.             set(App->Chord_Intervals_Box, MUIA_Text_Contents, inter0);
  401.             break;
  402.          case ID_CHORDCLOSE:
  403.             set(App->Chord_Info_Window, MUIA_Window_Open, FALSE);
  404.             set(App->Chord_Pro_Window, MUIA_Window_Sleep, FALSE);
  405.             break;
  406.          case ID_QUIT:
  407.             running = FALSE;
  408.             break;
  409.          case MUIV_Application_ReturnID_Quit:
  410.             running = FALSE;
  411.             break;
  412.       }
  413.  
  414.       if (running && signal) Wait(signal);
  415.    }
  416.  
  417.    DisposeApp(App);
  418.    CloseLibrary(MUIMasterBase);
  419.    exit(0);
  420.  
  421. }   
  422.  
  423. /***********************************************************************/
  424. /* Procedure : read_chords                                             */
  425. /* Purpose   : create the list of chords                               */
  426. /* Inputs    : none                                                    */
  427. /* Outputs   : CHORD_LIST - the head of the created list               */
  428. /* Notes     :                                                         */
  429. /***********************************************************************/
  430.  
  431. CHORD_LIST read_chords(void)
  432. {
  433.  
  434.    CHORD_LIST head = NULL, tail;
  435.    FILE *ifp;
  436.    char c;
  437.    int namepos, encodingpos, current_encoding, current_name;
  438.    current_encoding = 1;
  439.    current_name = 0;
  440.    namepos = encodingpos = 0;
  441.    char *temp_name;
  442.    char *temp_enco;
  443.    temp_name = calloc(20, sizeof(char));
  444.    temp_enco = calloc(13, sizeof(char));
  445.  
  446.    ifp = fopen("testfile-a.txt", "r");
  447.  
  448.    while ((c = getc(ifp)) != EOF)
  449.    {
  450.       if (c== ',')
  451.       {
  452.          current_encoding = 0;
  453.          current_name = 1;
  454.          temp_enco[encodingpos] = '\0';
  455.       }
  456.       else if (c == '!')
  457.       {
  458.          temp_name[namepos] = '\0';
  459.          current_name = 0;
  460.          current_encoding = 1;
  461.          head = malloc(sizeof(CHORD_ELEMENT));
  462.          head->name = calloc(20, sizeof(char));
  463.          head->encoding = calloc(13, sizeof(char));
  464.          strcpy(head->encoding, temp_enco);        
  465.          strcpy(head->name, temp_name);
  466.          tail = head;
  467.       }
  468.       else if (c == '&')
  469.       {
  470.          temp_name[namepos] = '\0';
  471.          current_name = 0;
  472.          current_encoding = 1;
  473.          tail->next = malloc(sizeof(CHORD_ELEMENT));
  474.          tail = tail->next;
  475.          tail->name = calloc(20, sizeof(char));
  476.          tail->encoding = calloc(13, sizeof(char));
  477.          strcpy(tail->encoding, temp_enco);
  478.          strcpy(tail->name, temp_name);
  479.       }
  480.       else if (c == '?')
  481.       {
  482.          temp_name[namepos] = '\0';
  483.          tail->next = malloc(sizeof(CHORD_ELEMENT));
  484.          tail = tail->next;
  485.          tail->name = calloc(20, sizeof(char));
  486.          tail->encoding = calloc(13, sizeof(char));
  487.          strcpy(tail->encoding, temp_enco);        
  488.          strcpy(tail->name, temp_name);
  489.          tail->next = NULL;
  490.       }
  491.       else if (c == '\n')
  492.       {
  493.          current_name = 0;
  494.          current_encoding = 1;
  495.          encodingpos = namepos = 0;
  496.       }
  497.       else if (current_encoding)
  498.       {
  499.          temp_enco[encodingpos] = c;
  500.          ++encodingpos;
  501.       }
  502.       else if (current_name)
  503.       {
  504.          temp_name[namepos] = c;
  505.          ++namepos;
  506.       }
  507.    }
  508.  
  509.    fclose(ifp);
  510.   
  511.    return head;
  512.  
  513. }
  514.  
  515.